﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Security;
using Intelsi.Entity;
using Intelsi.BusinessLogic;
using Microsoft.Practices.Unity;

namespace Intelsi.WB
{
    public partial class frmRegistrarEntradaProductos : System.Web.UI.Page
    {
        [Dependency]
        public IProyectoBL proyectoBL { get; set; }

        [Dependency]
        public IProductoBL productoBL { get; set; }

        [Dependency]
        public ITrabajadorBL trabajadorBL { get; set; }

        [Dependency]
        public IProveedorBL proveedorBL { get; set; }

        [Dependency]
        public IEntradaProductosBL entradaproductosBL { get; set; }

        private const string VARPRODUCTO = "producto";
        private const string VARENTRADA = "entrada";
        private const string VARENTRADANUEVA = "nueventrap";
        private const string VARPROVEEDOR = "proveedor";

        protected void Page_Load(object sender, EventArgs e)
        {




            var acc = Request.QueryString["acc"];

            if (!Page.IsPostBack)
            {

                string userName = HttpContext.Current.User.Identity.Name;
                var trabajador = trabajadorBL.GetFromTrabajadorByCorreoCorporativo(userName);

                string cargo = trabajador.Cargo;

                if (acc != string.Empty)
                {
                    if (acc == "nuevo" && (cargo == "Almacenero" || cargo == "Gerente"))
                    {
                        var entrada = new EntradaProductoDTO();
                        BindNuevaEntrada(entrada);

                        btnCancelar.Text = "Cancelar";
                        txtCodigo.Enabled = false;
                        txtFechaEntrada.Enabled = false;
                        txtResponsable.Enabled = false;
                        btnReporte.Visible = false;
                    }
                    else if (acc == "ver" && (cargo == "Almacenero" || cargo == "Gerente"))
                    {
                        var IdEntrada = Int32.Parse(Request.QueryString["IdEntrada"]);
                        var entrada = entradaproductosBL.GetAllFromEntradaByIdEntrada(IdEntrada);

                        BindVerEntrada(entrada);

                        btnCancelar.Text = "Atras";
                        txtCodigo.Enabled = false;
                        txtFechaEntrada.Enabled = false;
                        txtResponsable.Enabled = false;
                        txtComprobante.Enabled = false;
                        txtComentario.Enabled = false;
                        txtProveedor.Enabled = false;
                        panelproducto.Visible = false;
                        lblmensaje.Visible = false;
                        btnAgregar.Visible = false;
                        btnGuardar.Visible = false;

                        GrillaEntradaProductos.Columns[5].Visible = false;

                    }

                    else
                    {
                        Page.ClientScript.RegisterStartupScript(this.GetType(),
                                   "mensaje",
                                      "<script type=\"text/javascript\">" +
                                         "alert(\"Usted No tiene Los Permiso Nesesarios Para esto\");" +
                                         "document.location=('Default.aspx');" +
                                           "</script>", false);
                    }
                }
            }
        }

        private void BindVerEntrada(EntradaProductoDTO entradaProducto1)
        {
            txtCodigo.Text = entradaProducto1.IdEntrada.ToString();
            txtFechaEntrada.Text = entradaProducto1.FechaEntrada.ToShortDateString();
            txtComprobante.Text = entradaProducto1.NroComprobante;
            txtComentario.Text = entradaProducto1.Comentario;

            hfIdTrabajador.Value = entradaProducto1.IdAlmacenero.ToString();
            txtResponsable.Text = entradaProducto1.NombreAlmacenero;

            hfIdProvedor.Value = entradaProducto1.IdProvedor.ToString();
            txtProveedor.Text = entradaProducto1.NombreProvedor;

            GrillaEntradaProductos.DataSource = entradaProducto1.DetalleEntrada;
            GrillaEntradaProductos.DataBind();
            Cache.Insert(VARENTRADA, entradaProducto1);
        }

        private void BindNuevaEntrada(EntradaProductoDTO entradaProducto)
        {
            string userName = HttpContext.Current.User.Identity.Name;
            var trabajador = trabajadorBL.GetFromTrabajadorByCorreoCorporativo(userName);

            entradaProducto.IdEntrada = 0;
            entradaProducto.FechaEntrada = DateTime.Now;

            txtCodigo.Text = entradaProducto.IdEntrada.ToString();
            txtFechaEntrada.Text = entradaProducto.FechaEntrada.ToShortDateString();

            entradaProducto.Comentario = txtComentario.Text;
            entradaProducto.NroComprobante = txtComprobante.Text;

            hfIdTrabajador.Value = trabajador.IdTrabajador.ToString();
            txtResponsable.Text = trabajador.Ape_Nomb;
            entradaProducto.IdAlmacenero = Int32.Parse(hfIdTrabajador.Value);
            entradaProducto.NombreAlmacenero = txtResponsable.Text;

            hfIdProvedor.Value = entradaProducto.IdProvedor.ToString();
            GrillaEntradaProductos.DataSource = entradaProducto.DetalleEntrada;
            GrillaEntradaProductos.DataBind();

            Cache.Insert(VARENTRADANUEVA, entradaProducto);
        }

        protected void btnAgregar_Click(object sender, EventArgs e)
        {
            CargarProveedorEnMemoria();
            CargarProductosInMemoria();

            var entradaProducto = Cache.Get(VARENTRADANUEVA) as EntradaProductoDTO;
            var producto = Cache.Get(VARPRODUCTO) as DetalleEntradaProductoDTO;

            var cantidad = decimal.Parse(txtCantidad.Text);

            var query = from ep in entradaProducto.DetalleEntrada
                        where ep.IdProducto.Equals(Int32.Parse(hfIdProducto.Value))
                        select ep;

            if (query.SingleOrDefault() != null)
            {
                lblmensaje.Text = "El producto ya se encuentra";
            }
            else
            {
                DetalleEntradaProductoDTO nuevoDetalle = new DetalleEntradaProductoDTO()
                {
                    IdProducto = producto.IdProducto,
                    NombreCategoria = producto.NombreCategoria,
                    NombreMarca = producto.NombreMarca,
                    DescripcionProducto = producto.DescripcionProducto,
                    Cantidad = cantidad,
                    UniMedida = producto.UniMedida
                };

                entradaProducto.DetalleEntrada.Add(nuevoDetalle);
                Cache.Insert(VARENTRADANUEVA, entradaProducto);
                BindNuevaEntrada(entradaProducto);

                lblmensaje.Text = "";
            }
        }

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
                var detalle = new DetalleEntradaProductoDTO();

                var entrada = Cache.Get("nueventrap") as EntradaProductoDTO;

                BindNuevaEntrada(entrada);

                entradaproductosBL.RegistrarEntradaProducto(entrada);

                Response.Redirect("frmListarEntradas.aspx");
        }

        public void CargarProveedorEnMemoria()
        {
            var proveedor = Cache.Get(VARENTRADANUEVA) as EntradaProductoDTO;
            proveedor.IdProvedor = Int32.Parse(hfIdProvedor.Value);
            proveedor.NombreProvedor = txtProveedor.Text;

            Cache.Insert(VARENTRADANUEVA, proveedor);
        }

        public void CargarProductosInMemoria()
        {
            var producto1 = new DetalleEntradaProductoDTO();
            producto1.IdProducto = Int32.Parse(hfIdProducto.Value);
            producto1.DescripcionProducto = txtProducto.Text;
            producto1.NombreCategoria = txtcategoria.Text;
            producto1.NombreMarca = txtmarca.Text;
            producto1.UniMedida = txtunimedida.Text;

            txtcategoria.Enabled = false;
            txtmarca.Enabled = false;
            txtunimedida.Enabled = false;

            Cache.Insert(VARPRODUCTO, producto1);
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            Response.Redirect("frmListarEntradas.aspx");
        }

        protected void btnReporte_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/REPORTES/frmReporteEntradaProductos.aspx?IdEntrada=" + txtCodigo.Text);
        }
    }
}